<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Promise.all和Promise.race的区别</title>
</head>
<body>

</body>
<script>
  // Promise.all()可以将多个实例组装个成一个新实例，成功的时候返回一个成功的数组；失败的时候则返回最先被reject失败状态的值。
  // 适用场景：比如当一个页面需要在很多个模块的数据都返回回来时才正常显示，否则loading。
  // Promise.all中的子任务是并发执行的，适用于前后没有依赖关系的。
  let wake=(time)=>{
    return new Promise(function (resolve,reject){
      setTimeout(()=>{
        resolve(`${time/1000}后醒来`);
      },time);
    });
  }
  let p1 = wake(10000);
  let p2 = wake(1000);
  Promise.all([p1,p2]).then(res=>{
    let [res1,res2]=res;
    console.log(res1,res2);
  }).catch(err=>{
    console.log(err);
  })

  // Promise.race()意为赛跑的意思，也就是数组中的任务哪个获取的快，就返回哪个，不管结果本身是成功还是失败。
  // 一般用于和定时器绑定，比如将一个请求和三秒的定时器包装成Promise实例，加入到Promise队列中，
  // 请求三秒中还没有回应时，给用户一些提示或相应的操作。
  let p3 = new Promise((resolve,reject)=>{
    setTimeout(() => {
      resolve('success');
    }, 10000);
  });

  let p4 = new Promise((resolve,reject)=>{
    setTimeout(() => {
      reject('failed');
    }, 500);
  });

  Promise.race([p3,p4]).then(res=>{
    console.log(res);  
  }).catch(err => {
    console.log(err); // 返回的是failed
  })




  // 同时发送多个请求，子任务是并行的
  this.$axios.all([
    this.$axios.get("api/one"),
    this.$axios.get("api/two"),
    this.$axios.get("api/three")
  ]).then(data=>{
    console.log(data)
  });


  // 哪个先拿到请求结果，就用哪个
  Promise.race([
    this.$axios.get("api/one"),
    this.$axios.get("api/two"),
    this.$axios.get("api/three")
  ]).then(data => {
    console.log(data);
  });

</script>
</html>